package com.ruoyi.projects.service.impl;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.projects.Vos.SlSchedulesRecord;
import com.ruoyi.projects.Vos.SlSchedulesVoTo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.projects.mapper.SlSchedulesMapper;
import com.ruoyi.projects.domain.SlSchedules;
import com.ruoyi.projects.service.ISlSchedulesService;

/**
 * 会员排期Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-04-21
 */
@Service
public class SlSchedulesServiceImpl implements ISlSchedulesService 
{
    @Autowired
    private SlSchedulesMapper slSchedulesMapper;

    /**
     * 查询会员排期
     * 
     * @param sId 会员排期主键
     * @return 会员排期
     */
    @Override
    public SlSchedules selectSlSchedulesBySId(Long sId)
    {
        return slSchedulesMapper.selectSlSchedulesBySId(sId);
    }

    /**
     * 查询会员排期列表
     * 
     * @param slSchedules 会员排期
     * @return 会员排期
     */
    @Override
    public List<SlSchedules> selectSlSchedulesList(SlSchedules slSchedules)
    {
        return slSchedulesMapper.selectSlSchedulesPage(slSchedules);
    }

    /**
     * 新增会员排期
     * 
     * @param slSchedules 会员排期
     * @return 结果
     */
    @Override
    public int insertSlSchedules(SlSchedules slSchedules)
    {
        slSchedules.setCreateTime(DateUtils.getNowDate());
        return slSchedulesMapper.insertSlSchedules(slSchedules);
    }

    /**
     * 修改会员排期
     * 
     * @param slSchedules 会员排期
     * @return 结果
     */
    @Override
    public int updateSlSchedules(SlSchedules slSchedules)
    {
        slSchedules.setUpdateTime(DateUtils.getNowDate());
        return slSchedulesMapper.updateSlSchedules(slSchedules);
    }

    /**
     * 批量删除会员排期
     * 
     * @param sIds 需要删除的会员排期主键
     * @return 结果
     */
    @Override
    public int deleteSlSchedulesBySIds(Integer[] sIds)
    {
        return slSchedulesMapper.deleteSlSchedulesBySIds(sIds);
    }

    /**
     * 删除会员排期信息
     * 
     * @param sId 会员排期主键
     * @return 结果
     */
    @Override
    public int deleteSlSchedulesBySId(Integer sId)
    {
        return slSchedulesMapper.deleteSlSchedulesBySId(sId);
    }

    /**
     * 新增所有会员排期
     */
    @Override
    public int addOrUpdateOrDeleteAll(SlSchedulesVoTo slSchedulesVoTo) {
        // 1. 获取前端传递的所有排期列表（包含新增、修改的记录，已删除的不会在此列表中）
        List<SlSchedules> frontSchedulesList = slSchedulesVoTo.getProjectSchedulesList();
        if (frontSchedulesList == null || frontSchedulesList.isEmpty()) {
            // 特殊情况：前端列表为空，说明要删除该cardId下所有排期
            return slSchedulesMapper.deleteSlSchedulesByCardId(slSchedulesVoTo.getCardId());
        }

        // 2. 查询数据库中该cardId对应的所有现有排期记录（作为基准数据）
        Long cardId = slSchedulesVoTo.getCardId();
        SlSchedules query = new SlSchedules();
        query.setCardId(cardId);
        List<SlSchedules> dbSchedulesList = slSchedulesMapper.selectSlSchedulesList(query); // 需要新增的mapper方法

        // 3. 提取前端列表中已存在的sId（排除新增记录：sId为null或<=0的是新增）
        Set<Integer> frontExistSIds = frontSchedulesList.stream()
                .map(SlSchedules::getsId)
                .filter(sId -> sId != null && sId > 0) // 只保留有效sId
                .collect(Collectors.toSet());

        // 4. 计算需要删除的sId：数据库中存在，但前端列表中不存在的sId
        List<Integer> needDeleteSIds = dbSchedulesList.stream()
                .map(SlSchedules::getsId)
                .filter(sId -> !frontExistSIds.contains(sId)) // 不在前端列表中
                .collect(Collectors.toList());

        // 5. 处理删除操作（如果有需要删除的记录）
                int deleteCount = 0;
                if (!needDeleteSIds.isEmpty()) {
                    // 将List<Integer>转换为Integer数组（关键修正）
                    Integer[] sIdsArray = needDeleteSIds.toArray(new Integer[0]);
                    // 调用批量删除方法（传入Integer数组）
                    deleteCount = slSchedulesMapper.deleteSlSchedulesBySIds(sIdsArray);
                }


        // 6. 处理新增和修改操作（复用原有逻辑，针对前端传递的列表）
        int addOrUpdateCount = 0;
        for (SlSchedules slSchedules : frontSchedulesList) {
            // 设置公共字段
            slSchedules.setCardId(cardId);
            slSchedules.setIntervalDays(slSchedulesVoTo.getIntervalDays());

            if (slSchedules.getsId() == null || slSchedules.getsId() <= 0) {
                // 新增：设置创建时间
                slSchedules.setCreateTime(DateUtils.getNowDate());
                slSchedulesMapper.insertSlSchedules(slSchedules);
            } else {
                // 修改：设置更新时间
                slSchedules.setUpdateTime(DateUtils.getNowDate());
                slSchedulesMapper.updateSlSchedules(slSchedules);
            }
            addOrUpdateCount++;
        }

        // 7. 返回总处理条数（新增+修改+删除）
        return addOrUpdateCount + deleteCount;
    }

    /**
     * 卡排期记录查询
     * @param cardId
     * @return
     */
    @Override
    public List<SlSchedulesRecord> schedules(Long cardId) {
        return slSchedulesMapper.schedulesByCardId(cardId);
    }

}
